package com.example.demoexcel.controller;

import com.example.demoexcel.tools.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @version 1.0.0
 * @className: TestController
 * @description:
 * @author: zhangjunfa
 * @date: 2022/12/30 13:55
 */
@Slf4j
@RestController
@RequestMapping
public class TestController {
    /**
     * HSSFWorkbook 请求案例
     *
     * @param response:
     * @return void
     * @author zhangjunfa
     * @date 2022/12/30 15:34
     */
    @GetMapping("/testHSSFWorkbook")
    public void testHSSFWorkbook(HttpServletResponse response) {
        //1、创建HSSFWorkbook对象（工作簿）
        HSSFWorkbook workbook = new HSSFWorkbook();
        //2、建立sheet对象（工作表）
        HSSFSheet sheet = workbook.createSheet("成绩表");
        //3、在sheet里创建第一行，参数为行索引（第一行，0行）
        HSSFRow row1 = sheet.createRow(0);
        //4、创建列
        // (1,1) 第一行第一列的单元格
        HSSFCell cell = row1.createCell(0);
        //设置单元格内容（1,1）
        cell.setCellValue("学生成绩表");
        //合并单元格CellRangeAddress构造参数依次表示起始行，截至行，起始列， 截至列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));

        //在sheet里创建第二行
        // （2,1）第二行第一列的单元格
        HSSFRow row2 = sheet.createRow(1);
        //创建单元格并设置单元格内容
        row2.createCell(0).setCellValue("姓名");
        row2.createCell(1).setCellValue("班级");
        row2.createCell(2).setCellValue("语文成绩");
        row2.createCell(3).setCellValue("数学成绩");
        row2.createCell(4).setCellValue("英语成绩");

        //在sheet里创建第三行
        HSSFRow row3 = sheet.createRow(2);
        row3.createCell(0).setCellValue("小明");
        row3.createCell(1).setCellValue("1班");
        row3.createCell(2).setCellValue(80);
        row3.createCell(3).setCellValue(75);
        row3.createCell(4).setCellValue(88);
        HSSFRow row4 = sheet.createRow(3);
        row4.createCell(0).setCellValue("小红");
        row4.createCell(1).setCellValue("1班");
        row4.createCell(2).setCellValue(82);
        row4.createCell(3).setCellValue(70);
        row4.createCell(4).setCellValue(90);

        //输出Excel文件
        ExcelUtil.getResponse(response, workbook, "学生成绩表");
    }

    /**
     * SXSSFWorkbook 请求案例
     * 大数据。导出
     *
     * @param response:
     * @return void
     * @author zhangjunfa
     * @date 2022/12/30 15:34
     */
    @GetMapping("/testSXSSFWorkbook")
    public void testSXSSFWorkbook(HttpServletResponse response) {
        //1、创建一个工作簿
        // 内存中保留的行数，直到被清除
        Workbook workbook = new SXSSFWorkbook(5000);

        //2、创建一个工作表(sheet)
        Sheet sheet = workbook.createSheet("大数据导出sheet");

        //3、创建行

        // 添加表头：
        Row row1 = sheet.createRow(0);
        Cell cell1 = row1.createCell(0);
        //设置单元格内容（1,1）
        cell1.setCellValue("学生成绩表");
        //合并单元格CellRangeAddress构造参数依次表示起始行，截至行，起始列， 截至列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 9));

        //添加数据 列 表头
        Row row2 = sheet.createRow(1);
        //创建单元格并设置单元格内容
        row2.createCell(0).setCellValue("姓名");
        row2.createCell(1).setCellValue("班级");
        row2.createCell(2).setCellValue("语文成绩");
        row2.createCell(3).setCellValue("数学成绩");
        row2.createCell(4).setCellValue("英语成绩");
        row2.createCell(5).setCellValue("英语成绩");
        row2.createCell(6).setCellValue("英语成绩");
        row2.createCell(7).setCellValue("英语成绩");
        row2.createCell(8).setCellValue("英语成绩");
        row2.createCell(9).setCellValue("英语成绩");

        // 添加数据行、列
        for (int rowNum = 0; rowNum < 65537; rowNum++) {
            Row row = sheet.createRow(rowNum + 2);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(rowNum + "," + cellNum);
            }
        }

        //输出Excel文件
        ExcelUtil.getResponse(response, workbook, "学生成绩大数据表");

    }


    /**
     * HSSFWorkbook 请求案例
     * 样式优化
     *
     * @param response:
     * @return void
     * @author zhangjunfa
     * @date 2022/12/30 15:34
     */
    @GetMapping("/testHSSFWorkbookStyle")
    public void testHSSFWorkbookStyle(HttpServletResponse response) {
        //1、创建HSSFWorkbook对象（工作簿）
        HSSFWorkbook workbook = new HSSFWorkbook();
        //2、建立sheet对象（工作表）
        HSSFSheet sheet = workbook.createSheet("成绩表");

        //设置列宽
        sheet.setColumnWidth(0, 25 * 256);
        sheet.setColumnWidth(1, 25 * 256);
        sheet.setColumnWidth(2, 25 * 256);
        sheet.setColumnWidth(3, 25 * 256);
        sheet.setColumnWidth(4, 25 * 256);


        // 记住一点设置单元格样式相关的都是CellStyle来控制的,设置完之后只需set给单元格即可：cell.setCellStyle(cellStyle);
        // 合并单元格后居中
        CellStyle style = workbook.createCellStyle();
        // 垂直居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // 水平居中
        style.setAlignment(HorizontalAlignment.CENTER);

        // 设置字体
        Font font = workbook.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 16);
        font.setItalic(false);
        font.setStrikeout(false);

        //将字体添加到样式中
        style.setFont(font);

        // 设置背景色
        style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 设置边框（一般标题不设置边框，是标题下的所有表格设置边框）
        // style.setBorderBottom(BorderStyle.THIN); //下边框
        // style.setBorderLeft(BorderStyle.THIN);//左边框
        // style.setBorderTop(BorderStyle.THIN);//上边框
        // style.setBorderRight(BorderStyle.THIN);//右边框

        //3、在sheet里创建第一行，参数为行索引（第一行，0行）
        HSSFRow row1 = sheet.createRow(0);
        //合并单元格：参数1：行号 参数2：起始列号 参数3：行号 参数4：终止列号
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4));

        //4、创建列
        // (1,1) 第一行第一列的单元格
        HSSFCell cell = row1.createCell(0);
        // 将样式设置给第一行
        cell.setCellStyle(style);
        //设置单元格内容（1,1）
        cell.setCellValue("学生成绩表");

        //在sheet里创建第二行
        // （2,1）第二行第一列的单元格
        HSSFRow row2 = sheet.createRow(1);
        //创建单元格并设置单元格内容
        row2.createCell(0).setCellValue("姓名");
        row2.createCell(1).setCellValue("班级");
        row2.createCell(2).setCellValue("语文成绩");
        row2.createCell(3).setCellValue("数学成绩");
        row2.createCell(4).setCellValue("英语成绩");

        //在sheet里创建第三行
        HSSFRow row3 = sheet.createRow(2);
        row3.createCell(0).setCellValue("小明");
        row3.createCell(1).setCellValue("1班");
        row3.createCell(2).setCellValue(80);
        row3.createCell(3).setCellValue(75);
        row3.createCell(4).setCellValue(88);
        HSSFRow row4 = sheet.createRow(3);
        row4.createCell(0).setCellValue("小红");
        row4.createCell(1).setCellValue("1班");
        row4.createCell(2).setCellValue(82);
        row4.createCell(3).setCellValue(70);
        row4.createCell(4).setCellValue(90);

        //输出Excel文件
        ExcelUtil.getResponse(response, workbook, "学生成绩表");
    }


    @GetMapping("/readHSSFWorkbook")
    public void readHSSFWorkbook() throws IOException {
        String path = "D:\\360downloads\\";
        FileInputStream fileInputStream = new FileInputStream(path + "23456.xls");
        // 1.创建一个工作簿。使得excel能操作的，这边他也能操作。
//        Workbook workbook = new HSSFWorkbook(fileInputStream);
        Workbook workbook = new HSSFWorkbook(fileInputStream);

        // 2.得到表。
        Sheet sheet = workbook.getSheetAt(0);
        // 获取工作表中包含的最后一行（从0开始），如果不存在行，则返回-1
        int lastRowNum = sheet.getLastRowNum();
        for (int i = 0; i <= lastRowNum; i++) {
            // 循环得到行
            Row row = sheet.getRow(i);
            // 循环得到列。
            // Cell cell = row.getCell(0);
            for (Cell cell : row) {
                if (cell != null) {
                    CellType cellType = cell.getCellType();
                    log.info("数据类型：{}", cellType);
                    String value = cell.getStringCellValue();
                    if (value != null && !"".equals(value)) {
                        log.info("获取到的列：{}", value);
                    }
                }
            }

        }
        // // 3.得到行。
        // Row row = sheet.getRow(0);
        // // 4.得到列。
        // Cell cell = row.getCell(0);
        // // 读取值。一定要注意类型，否则会读取失败
        // log.info("字符串类型:{}",cell.getStringCellValue());
        // Cell cell1 = row.getCell(1);
        // log.info("数字类型:{}",cell1.getNumericCellValue());
        // 5.关闭流。
        fileInputStream.close();
    }




}
